package Road;

import java.util.Scanner;

/**
 * create by Sun
 * 2018/8/22
 * 最短路径  n 3此房
 */
public class Floy {
    static int n;
    static final Integer max=Integer.MAX_VALUE;
    static int[][] map=new int[1000][1000];
    static int[][] dis=new int[1000][1000];
    static int[][] cost=new int[1000][1000];


//    static void floy(){
//
//        for(int k=0;k<n;k++){
//            for(int i=0;i<n;i++){
//                for(int j=0;j<n;j++){
//                    if(dis[i][j]>dis[i][k]+dis[k][j]){
//                        dis[i][j]=dis[i][k]+dis[k][j];
//                        cost[i][j]=cost[i][k]+cost[k][j];
//                    }
//                    else if(dis[i][j]==dis[i][k]+dis[k][j]&& cost[i][j]>cost[i][k]+cost[k][j])
//                    {
//                        cost[i][j]=cost[i][k]+cost[k][j];
//                    }
//                }
//            }
//        }
//    }
//
//    public static void main(String[] args) {
//         Scanner sc=new Scanner(System.in);
//         int m,s,v;
//         int a,b,c,d;
//
//         int t=sc.nextInt();
//         while (t--!=0){
//             n=sc.nextInt();
//             m=sc.nextInt();
//             s=sc.nextInt();
//             v=sc.nextInt();
//             for(int i = 0; i < n; i++)
//                 for(int j = 0; j < n; j++)
//                     if(i == j)
//                     {
//                         cost[i][j] = 0;
//                         dis[i][j] = 0;
//                     }
//                     else
//                     {
//                         dis[i][j]=dis[j][i]=max;
//                        cost[i][j]=cost[j][i]=max;
//                     }
//
//             while(m--!=0)
//             {
//                 a=sc.nextInt();
//                 b=sc.nextInt();
//                 c=sc.nextInt();
//                 d=sc.nextInt();
//                 dis[a][b]=dis[b][a]=c;
//                 cost[a][b]=cost[b][a]=d;
//             }
//             floy();
//             System.out.println(dis[s][v]+" "+cost[s][v]);
//
//         }
//
//
//    }
//
//
    private static void floy() {


        for(int k=0;k<n;k++){
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++){
                    if(dis[i][j]>dis[i][k]+dis[k][j]){
                        dis[i][j]=dis[i][k]+dis[k][j];
                        cost[i][j]=cost[i][k]+cost[k][j];
                    }
                    else if (dis[i][j]==dis[i][k]+dis[k][j]&& cost[i][j]>cost[i][k]+cost[k][j]){
                        cost[i][j]=cost[i][k]+cost[k][j];
                    }
                }
            }
        }

    }
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int t=sc.nextInt();
        while (t--!=0){
             n=sc.nextInt();
            int m=sc.nextInt();
            int s=sc.nextInt();
            int k=sc.nextInt();
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++){
                    if(i==j){
                        dis[i][j]=0;
                        cost[i][j]=0;
                    }else {
                        dis[i][j]=dis[j][i]=max;
                        cost[i][j]=cost[j][i]=max;
                    }
                }
            }
            for(int i=0;i<m;i++){
                int a=sc.nextInt();
                int b=sc.nextInt();
                int c=sc.nextInt();
                int d=sc.nextInt();

                   dis[a][b]=dis[b][a]=c;
                   cost[a][b]=cost[b][a]=d;
            //    dis[a][b]=dis[b][a]=c;
//                 cost[a][b]=cost[b][a]=d;




            }
            floy();
            System.out.println(dis[s][k]+" "+cost[s][k]);
        }
    }
}
